package com.cd.music.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TimeZone;

/**
 * @author yxl 余秀良
 * @version 1.0
 * @description: token生成工具类
 * @date 2017年05月09日 上午10:36
 * @address: 四川成都
 */
public final class TokenUtil {

    private TokenUtil() {
        throw new UnsupportedOperationException("这是一个工具类不能实例化");
    }

    /**
     * 过期天数
     *
     * @param parameter     需要生成token的参数
     * @param expirationDay 过期时间 单位：天
     * @return 返回token
     */
    public synchronized static String getToken(Object parameter, int expirationDay) {
        Calendar now = Calendar.getInstance();
        now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
        Date date = now.getTime();
        long time = date.getTime();
        long day = expirationDay * 24L * 60 * 60 * 1000;
        time += day;
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
        String strTime = formatter.format(time);
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("parameter", parameter);
        map.put("date", strTime);
        String s = JSON.toJSONString(map);
        return AESUtil.encrypt(EncryptUtil.encryption(s));
    }

    /**
     * 获取token里面的参数
     *
     * @param token 登录token
     * @return 返回json数据
     */
    public static String getParameter(String token) {
        Map map = getTokenMap(token);
        return map.get("parameter").toString();
    }

    /**
     * 获取token里面的参数
     *
     * @param token 登录token
     * @return 返回json数据
     */
    public static <T> T getParameter(String token, Class<T> clazz) {
        Map map = getTokenMap(token);
        String parameter = map.get("parameter").toString();
        return JSONObject.parseObject(parameter, clazz);
    }

    /**
     * 是否过期
     *
     * @param token 密钥
     * @return 返回true/false 过期为true 未过期为false
     */
    public static boolean isExpiration(String token) {
        Map map = getTokenMap(token);
        if (map != null && !map.isEmpty()) {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
            Calendar now = Calendar.getInstance();
            now.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
            String nowTime = formatter.format(now.getTime());
            String key = "date";
            if (map.containsKey(key)) {
                String expirationTime = map.get(key) + "";
                if (!StringUtil.isEmpty(expirationTime)) {
                    return Long.parseLong(expirationTime) <= Long.parseLong(nowTime);
                } else {
                    throw new RuntimeException("过期时间不正确");
                }
            } else {
                throw new RuntimeException("密钥错误");
            }
        }
        return false;
    }

    /**
     * 获取token里面的map
     *
     * @param token 登录token
     * @return MAP
     */
    private static Map getTokenMap(String token) {
        String decrypt = AESUtil.decrypt(token);
        String decryption = EncryptUtil.decryption(decrypt);
        return JSON.parseObject(decryption, Map.class);
    }
}
